﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>

        /// Получить таблицу пользователей

        /// </summary>

        public static DataTable GetUserTable()
        {

            DataTable table = new DataTable("User");



            try
            {

                table.ExtendedProperties.Add("Columns", GetUserTableCols());

                FillTable(table, "select UserID, Name, Password, RoleID, Descr from [User] order by UserID");

                table.DefaultView.Sort = "UserID";

            }

            catch (Exception ex)
            {

                throw new Exception("Ошибка при получении таблицы пользователей:\n" + ex.Message);

            }



            return table;

        }



        /// <summary>

        /// Получить колонки для таблицы пользователей

        /// </summary>

        private static DataGridViewColumn[] GetUserTableCols()
        {

            DataGridViewColumn[] cols = new DataGridViewColumn[5];

            cols[0] = NewTextBoxColumn("Идент.", "UserID");

            cols[1] = NewTextBoxColumn("Имя", "Name");

            cols[2] = NewTextBoxColumn("Пароль", "Password");

            cols[3] = NewComboBoxColumn("Роль", "RoleID", GetRoleTable(), "Name", "RoleID");

            cols[4] = NewTextBoxColumn("Описание", "Descr");

            return cols;

        }



        /// <summary>

        /// Заполнить таблицу на основе заданного запроса, создать адаптер данных и команды на изменение данных

        /// </summary>

        private static void FillTable(DataTable dataTable, string sql)
        {

            SqlCeDataAdapter adapter = new SqlCeDataAdapter(sql, AppData.Conn);

            adapter.ContinueUpdateOnError = true;

            adapter.FillSchema(dataTable, SchemaType.Source); // для определения свойств столбцов AllowDBNull, MaxLength

            adapter.Fill(dataTable);



            dataTable.ExtendedProperties.Add("DataAdapter", adapter);

            dataTable.BeginLoadData(); // выключить контроль ограничений вводимых данных



            SqlCeCommandBuilder builder = new SqlCeCommandBuilder(adapter);

            builder.ConflictOption = ConflictOption.OverwriteChanges;

        }



        /// <summary>

        /// Сохранить изменения таблицы в БД

        /// </summary>

        public static bool UpdateData(DataTable dataTable, out string errMsg)
        {

            try
            {

                if (dataTable != null)
                {

                    SqlCeDataAdapter adapter = dataTable.ExtendedProperties["DataAdapter"] as SqlCeDataAdapter;

                    if (adapter != null)
                    {

                        adapter.Update(dataTable);



                        if (dataTable.HasErrors)
                        {

                            DataRow[] rowsInError = dataTable.GetErrors();

                            StringBuilder sb = new StringBuilder();

                            foreach (DataRow row in rowsInError)
                            {

                                string rowError = TranlateError(row.RowError, dataTable.TableName);

                                row.RowError = rowError;

                                sb.AppendLine(rowError);

                            }



                            errMsg = "Ошибка при сохранении изменений таблицы в БД:\n" + sb.ToString().TrimEnd();

                            return false;

                        }

                    }

                }



                errMsg = "";

                return true;

            }

            catch (Exception ex)
            {

                errMsg = "Ошибка при сохранении изменений таблицы в БД:\n" + ex.Message;

                return false;

            }

        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
          
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}
